// 重载运算符
#include <iostream>

using namespace std;

class Box
{
private:
  double length;  // 长度
  double breadth; // 宽度
  double height;  // 高度
public:
  Box(void);
  ~Box();

  double getVolume(void)
  {
    return length * breadth * height;
  }

  void setLength(double len)
  {
    length = len;
  }

  void setBreadth(double bre)
  {
    breadth = bre;
  }

  void setHeight(double hei)
  {
    height = hei;
  }

  // NOTE: 重载操作符, 重载将两个对象相加，
  Box operator+(const Box &b)
  {
    // 内部创建一个 box，同时计算 class 内部的属性， 这里声明的是 class 内部的成员属性，
    // 可以访问 class 内部的属性变量
    Box box;
    box.length = this->length + b.length;
    box.breadth = this->breadth + b.breadth;
    box.height = this->height + b.height;
    return box;
  }
};

Box ::Box(void)
{
  cout << "call 构造函数" << endl;
}

Box ::~Box()
{
  cout << "call 析构函数" << endl;
}

// NOTE: 外部重载操作符，那么该重载将不是 class 的成员属性

int main(int argc, char const *argv[])
{
  Box Box1; // 声明 Box1，类型为 Box
  Box Box2; // 声明 Box2，类型为 Box
  Box Box3; // 声明 Box3，类型为 Box

  double volume(0.0);

  // Box1 详述
  Box1.setLength(6.0);
  Box1.setBreadth(7.0);
  Box1.setHeight(5.0);

  // Box2 详述
  Box2.setLength(12.0);
  Box2.setBreadth(13.0);
  Box2.setHeight(10.0);

  // Box1 的体积
  volume = Box1.getVolume();
  cout << "Volume of Box1 : " << volume << endl;

  // Box2 的体积
  volume = Box2.getVolume();
  cout << "Volume of Box2 : " << volume << endl;

  // NOTE: 把两个对象相加，得到 Box3, 这里通过 重载了 operator+ (加号) 操作符， 在内部创建了 box
  Box3 = Box1 + Box2;

  // NOTE: Box3 的体积
  volume = Box3.getVolume();
  cout << "Volume of Box3 : " << volume << endl;
  return 0;
}
